home *** CD-ROM | disk | FTP | other *** search
/ Aminet 7 / Aminet 7 - August 1995.iso / Aminet / misc / sci / RARS_Amiga_3.lha / RARS / bingo1.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-27  |  2.5 KB  |  100 lines

  1. // BINGO.CPP
  2. // This is just a fairly simple modification of my first robot Bingo so
  3. // that the car will stay on the circuit fourmile.trk.
  4.  
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <math.h>
  8. #include "car.h"
  9.  
  10. const double BREAK_ANGLE   = 0.06;
  11. const double NBA           = 0.1;
  12. const double DAMPING       = 4.2;
  13. const double GAIN          = 0.01;
  14. const double FC            = 1;      /*Friction Coefficient*/
  15. // const double g             = 32.2;
  16. const double V_FACTOR      = 1.3;
  17. const double VF2           = 1.06;
  18. const double ZFACT         = 0;
  19.  
  20. double cnr_speed(double rho)
  21. {
  22.   return sqrt(abs(rho)*g)*VF2;
  23. }
  24.  
  25. con_vec Bingo1(situation& s)
  26. {
  27.    const char name[] = "Bingo1";
  28.    static int init_flag = 1;
  29.    con_vec result;
  30.    static double alpha, vc, width, a, b, v1, v2, u, c;
  31.    static int start,off;
  32.  
  33.    if(init_flag)  {
  34.       my_name_is(name);
  35.       init_flag = 0;
  36.       result.alpha = result.vc = 0; start = 1;
  37.       return result;
  38.    }
  39.  
  40.    if(start){
  41.      start = 0; width = s.to_lft + s.to_rgt;
  42.      a = s.cur_rad; b = s.cur_len; v1 = cnr_speed(s.nex_rad);
  43.    }
  44.  
  45.   if(stuck(s.backward, s.v,s.vn, s.to_lft,s.to_rgt, &result.alpha,&result.vc))
  46.       return result;
  47.  
  48.   if((s.cur_rad!=a) || (s.cur_len!=b)) {
  49.     a = s.cur_rad; b = s.cur_len; c = v1; off = 0;
  50.     if((s.after_rad!=0) && (s.nex_rad!=0)){
  51.       v1 = cnr_speed(s.nex_rad);
  52.       v2 = cnr_speed(s.after_rad+width*ZFACT);
  53.       if (v2<v1) {
  54.     u = (v1*v1-v2*v2)/(2*g*FC);
  55.     if ((s.nex_len<0.1 ? s.nex_len : BREAK_ANGLE) < u/abs(s.nex_rad))
  56.       v1 = sqrt(v2*v2 + 2*((s.nex_len<0.1 ? s.nex_len : BREAK_ANGLE)*abs(s.nex_rad)*g*FC));
  57.       }
  58.     }
  59.     else {
  60.       if (s.nex_rad == 0) {
  61.     v2 = cnr_speed(abs(s.after_rad)+width/2);
  62.     v1 = sqrt(v2*v2 + 2*s.nex_len*g*FC);
  63.       }
  64.       else {
  65.     v1 = cnr_speed(s.nex_rad);
  66.       }
  67.     }
  68.   }
  69.  
  70.   if (s.cur_rad==0) {
  71.     vc = ( s.to_end<(s.v*s.v-v1*v1)/(2*g*FC) ? 0 : 5*(s.v+10));
  72.     u = (s.nex_rad>0 ? -1 : 1)*(width/2 - 20)+width/2;
  73.     alpha = GAIN*(s.to_lft-u);
  74.     if (s.v!=0)
  75.       alpha -= DAMPING*asin(s.vn/s.v);
  76.   }
  77.   else {
  78.     vc = c*V_FACTOR;
  79.     if (s.to_end<BREAK_ANGLE){
  80.       alpha = 0;
  81.       if (v1>s.v)
  82.     vc = 2*s.v;
  83.       else
  84.     vc = s.v/5;
  85.     }
  86.     if (s.to_end*abs(s.cur_rad)>350){
  87.       vc = 2*s.v;
  88.     }
  89.     if (s.nex_rad == 0){
  90.       alpha = GAIN*(s.cur_rad>0 ? (s.to_lft-15) : (s.to_lft-width+15));}
  91.     else
  92.       alpha = GAIN*(s.nex_rad>0 ? (s.to_lft-15) : (s.to_lft-width+15));
  93.     alpha -= 2*DAMPING*asin(s.vn/s.v);
  94.   }
  95.   result.vc = vc; result.alpha = alpha;
  96.   return result;
  97. }
  98.  
  99.  
  100.